
#ifndef _DEVICE_INFO_H__
#define _DEVICE_INFO_H__

#include <string>
#include <set>
#include <filesystem>
#include "RouteUtil.h"
#include "json.h"

namespace fs = std::filesystem;
using namespace std;
namespace Media{

class ExternalDevInfo {
public:
    ExternalDevInfo(std::string devModel, int ability, string interface)
        : m_devModel(devModel), m_ability(ability), m_interface(interface) {}

    bool operator==(const ExternalDevInfo& other) const;

    bool operator<(const ExternalDevInfo& other) const;

    string getDevModel();
    string getInterface();
    int getAbility();
private:
    string m_devModel;                  //外部扩展设备的名称.这里需要使用接口区分以下避免两个usb口都插着同样的设备无法去区分
    int    m_ability;               //外部扩展设备支持能力，0-音视频，1-纯视频， 2-纯音频
    string   m_interface;                //设备的使用状态，true-正在使用，false-未在使用
};


class DeviceInfo{
public:
    /**
     * 比较kafka需要上报的信息是否改变
    */
    bool KafkaInfoCompare(DeviceInfo other);
    /**
     * 拼接卡夫卡上报需要的json
    */
    bool getkafkaJson(Json::Value &table);

    /**
     * 比较http需要上报的信息是否改变
    */
    bool httpInfoCompare(DeviceInfo other);
    /**
     * 拼接http上报需要的json
    */
    bool gethttpJson(Json::Value &table);

    
    /**
     *  获取设备全部信息
    */
    bool getDevInfo();
private:
    /**
     *  获取设备基本信息
    */
    bool getDevBaseinfo();
    /**
     * 获取设备网络信息
    */
    bool getDevNetworkinfo();
    /**
     * 获取设备存储相关信息
    */
    bool getDevStoreinfo();
    //判断是不是挂载节点
    bool isMountPoint(const char* directory);
    //获取存储空间大小和剩余空间大小
    bool GetSDStorage(const char *directory, unsigned long long & total, unsigned long long & free);
    /**
     * 获取外部连接设备相关信息
    */
    bool getExterninfo();

private:
    //以下是设备的基本信息
    string m_devModel = "";                  //设备类型
    string m_devName  = "";                   //设备名称
    string m_devSnCode = "";                 //sn码
    bool   m_workStatus = false;                //设备的工作状态，当前设备是否在播放场景
    unsigned long long m_workingTime = 0;   //设备上电持续工作时间（秒）
    string m_version = "";                   //当前设备的版本号
    string m_roomId  = "";                   //当前设备的RoomId
    //以下是设备的网络信息
    string m_wiredIP = "";                   //设备当前的有线IP地址
    string m_wiredMask = "";                 //有线网卡的子网掩码
    string m_wiredGateway = "";              //有线网卡的网关
    string m_wirelessIP = "";                //设备当前的无线IP地址
    string m_wirelessMask = "";                 //无线网卡的子网掩码
    string m_wirelessGateway = "";              //无线网卡的网关
    //以下是设备的存储空间信息
    unsigned long long m_sysTotalSize = 0;  //设备系统存储空间总大小
    unsigned long long m_sysFreeSize = 0;   //设备存储空间剩余大小
    unsigned long long m_sdTotalSize = 0;   //设备sd卡空间总大小
    unsigned long long m_sdFreeSize = 0;    //设备sd卡空间剩余大小
    //以下是设备的外部链接设备信息
    set<ExternalDevInfo> m_externalDev; //外部扩展设备信息
    //多个线程来获取设备信息需要加锁
    
};

}
#endif